//
//  DownloaderOperation.m
//  02-自定义NSOperation
//
//  Created by apple on 16/1/8.
//  Copyright © 2016年 apple. All rights reserved.
//

#import "DownloaderOperation.h"

@interface DownloaderOperation ()

/// 接收图片的地址
@property (nonatomic, copy) NSString *URLString;
/// 监听下载是否完成
@property (nonatomic, copy) void (^finishedBlock)(UIImage *image);

@end

@implementation DownloaderOperation

/*
 1. 这个类是专门处理下载
 2. 下载需要图片的地址
 3. 监听图片下载完成,主线程回调
 */

+ (instancetype)downloaderOperationWithURLString:(NSString *)URLString finishedBlock:(void (^)(UIImage *))finishedBlock
{
    //  创建自定义的下载操作
    DownloaderOperation *op = [[DownloaderOperation alloc] init];
    // 接收外界传入图片地址
    op.URLString = URLString;
    // 接收外界传入的回调
    op.finishedBlock = finishedBlock;
    
    return op;
}

// 自定义操作的执行的入口,一旦重写了这个方法之后,操作就会自动的执行这个里面的代码
- (void)main
{
    NSLog(@"传入 %@",[self.URLString lastPathComponent]);
    
    // 模拟网络延迟
    [NSThread sleepForTimeInterval:1.0];
    
    // 实现下载
    NSURL *url = [NSURL URLWithString:self.URLString];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *imgae = [UIImage imageWithData:data];
    
    // 一定要再耗时操作后面,回调前面做判断
    if (self.isCancelled) {
        NSLog(@"取消 %@",[self.URLString lastPathComponent]);
        return;
    }
    
    // 断言 : 保证一个条件一定是满足的,如果不满足,就崩溃.只在开发调试时有效.
    NSAssert(self.finishedBlock != nil, @"下载完成的回调 self.finishedBlock 不能为空");
    
    // 图片下载完成,需要将图片传递到控制器.代理,通知,block
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        NSLog(@"下载 %@",[self.URLString lastPathComponent]);
        self.finishedBlock(imgae);
        
        // 沙盒缓存
        [data writeToFile:[self.URLString appendCache] atomically:YES];
    }];
}

@end
